//
// Created by yanhai on 2020/5/1.
//

#include <iostream>
#include <vector>
#include <functional>
#include <algorithm>

using namespace std;

class Add {
public:
    Add(int temp) : m_x(temp) {}

    int operator()(int a, int b)
    {
        return a + b + m_x;
    }

private:
    int m_x;
};

int main()
{
    vector<int> myVec;
    sort(myVec.begin(), myVec.end(), greater<int>());
    // greater<int>()：Function Object: 函数对象，仿函数
    // greater<int>() 一个对象，调用()重载的对象
    // 一个类可以因为重载某一个运算符而改变对象的外观， [] ==> 数组
    // () ==> 像一个函数， 我们把重载了()的类产生的对象，称为仿函数，函数对象

    Add myAdd(100);
    assert(myAdd(1, 2) == 103);

    Add myAdd2(200);
    assert(myAdd2(1, 2) == 203);
    // 调用了一个函数()，为什么不用函数指针？
    // 因为当我们使用仿函数的时候，我们实际上是在调用一个对象
    // 我们可以为这个函数，附加额外的信息，从而可以充分利用c++内存对象布局中的代码绑定能力

    return 0;
}
